#include "esp_log.h"
#include "usb_aux_screen_ui.h"
#include "main_ui.h"
#include "md_images.h"
#include "md_languages.h"
#include "usb_ext_screen.h"
#include "work_status_setting.h"
#include "usbd_core.h"
#include "jpeg_decoder.h"

static const char *TAG = "usb_aux_screen_ui"; // 日志标签
// 声明字体
LV_FONT_DECLARE(myFont);
LV_FONT_DECLARE(lv_font_montserrat_14);

#define FRAME_BUFFER_SIZE (320 * 240 * 2) // 屏幕数据大小(320*240*RGB565)

static lv_obj_t *video_img; // 视频显示对象
static lv_img_dsc_t img_dsc; // 图像描述符
void exit_usb_aux_screen_ui(lv_obj_t *root)
{
    switch_to_main_screen(); // 切换到主界面
    /*删除对应的逻辑分析仪界面，防止多次调用，内存泄漏*/
    usb_ext_screen_deinit(0);
    set_work_status(USUALLY_WORK);
    if (img_dsc.data) {
        free(img_dsc.data);
        img_dsc.data = NULL;
    }
    /*因为功能界面多,而且不常用,所以删除*/
    lv_obj_del(root); //也可以把lv_scr_load_anim的auto_del设置为true
}

// 手势事件回调
static void
event_handler(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);

    if (code == LV_EVENT_GESTURE) {
        lv_indev_t *indev = lv_indev_get_act();
        if (!indev)
            return;

        lv_dir_t dir = lv_indev_get_gesture_dir(indev);

        // 保留右划检测
        if (dir == LV_DIR_RIGHT || dir == LV_DIR_TOP) {
            exit_usb_aux_screen_ui(e->target);
        }
    }
}
void refresh_usb_data2screen(uint8_t *data, uint32_t width, uint32_t height, uint32_t total)
{
    // JPEG图像解码配置结构体
    esp_jpeg_image_cfg_t jpeg_cfg = {
        // 输入数据缓冲区指针，指向待解码的JPEG图像数据
        .indata = (uint8_t *)data,

        // 输入数据的大小（字节数）
        .indata_size = total,

        // 输出数据缓冲区指针，用于存储解码后的图像数据
        .outbuf = (uint8_t *)img_dsc.data,

        // 输出缓冲区的大小（字节数）
        .outbuf_size = FRAME_BUFFER_SIZE,

        // 输出图像格式，此处设置为RGB565格式（16位色彩，红5位，绿6位，蓝5位）
        .out_format = JPEG_IMAGE_FORMAT_RGB565,

        // 输出图像缩放比例，此处设置为不缩放（保持原始尺寸）
        .out_scale = JPEG_IMAGE_SCALE_0,

        // 标志位配置
        .flags = {
            // 颜色字节交换标志，设置为1表示交换颜色字节顺序
            // 这通常用于调整字节序以匹配显示设备的预期格式
            .swap_color_bytes = 1,
        }
    };

    // JPEG解码输出结构体，用于接收解码后的图像信息
    esp_jpeg_image_output_t outimg;

    // 执行JPEG解码操作，使用上述配置进行解码
    // 解码结果将存储在outimg结构体中
    esp_err_t ret = esp_jpeg_decode(&jpeg_cfg, &outimg);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "JPEG decode failed, ret: %d", ret);
    } else { // 创建LVGL图像描述符
        img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR;
        img_dsc.header.always_zero = 0;
        img_dsc.header.reserved = 0;
        img_dsc.header.w = outimg.width;
        img_dsc.header.h = outimg.height;
        img_dsc.data_size = outimg.output_len;
        //img_dsc.data = icon_2048_map;
        ESP_LOGI(TAG, "width:%d, height:%d, total:%d", outimg.width, outimg.height, outimg.output_len);
        // 更新图像显示
        lv_img_set_src(video_img, &img_dsc);
    }

}

/* 
 * @ brief:创建USB屏UI
*/
lv_obj_t *create_usb_aux_screen_ui(void)
{
    // 创建根容器（全屏黑色背景）
    lv_obj_t *root = lv_obj_create(NULL);
    if (!root)
        return NULL;
    lv_obj_set_size(root, lv_pct(100), lv_pct(100));
    lv_obj_set_style_bg_color(root, lv_color_black(), LV_PART_MAIN);
    lv_obj_add_event_cb(root, event_handler, LV_EVENT_GESTURE, NULL);
    // 创建视频显示区域
    video_img = lv_img_create(root);
    lv_obj_set_size(video_img, lv_pct(100), lv_pct(100));
    lv_obj_align(video_img, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_bg_color(video_img, lv_color_black(), 0);
    lv_obj_add_flag(video_img, LV_OBJ_FLAG_CLICKABLE);// 使能点击事件

    /************初始化USB屏************************************/
    usb_ext_screen_init(0, ESP_USBD_BASE);
    img_dsc.data = malloc(FRAME_BUFFER_SIZE); //屏幕像素为320*240，RGB565格式
    return root;
}
